package Concorrentes;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.Vector;

import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;

public class Interface implements Runnable { //extends JFrame {
	
	Desenho desenho;
	Label carros, pedestres, guardas;
	
	Interface(){
		Frame frame = new Frame("Volta do feriadão");
		
		// Fecha a janela
		frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
		
		JPanel jpnl = new JPanel();
		JPanel botoes = new JPanel();
		botoes.setLayout(new GridLayout(8, 1));
		
		carros = new Label("Carros: " + Controlador.getNumeroCarros());
		pedestres = new Label("Pedestres: " + Controlador.getNumeroPedestres());
		guardas = new Label("Guardas: " + Controlador.getNumeroGuardas());
		
		Button btnComecar = new Button("Começar");
		btnComecar.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				// Acorda o primeiro trecho
				Controlador.iniciaSimulacao();
			}
		});
		
		Button btnAdicionaCarro = new Button("Carros++");
		btnAdicionaCarro.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				Controlador.adicionaUmCarro();
				carros.setText("Carros: " + Controlador.getNumeroCarros());
			}
		});
		
		Button btnAdicionaPedestre = new Button("Pedestre++");
		btnAdicionaPedestre.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				Controlador.adicionaUmPedestre();
				pedestres.setText("Pedestres: " + Controlador.getNumeroPedestres());
			}
		});
		
		Button btnTerminar = new Button("Terminar");
		btnTerminar.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				Controlador.setTerminouSimulacao(true);
			}
		});
		
		Button btnFechar = new Button("Fechar");
		btnFechar.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
		});
		
		botoes.add(guardas);
		botoes.add(pedestres);
		botoes.add(carros);
		botoes.add(btnComecar);
		botoes.add(btnAdicionaCarro);
		botoes.add(btnAdicionaPedestre);
		botoes.add(btnTerminar);
		botoes.add(btnFechar);
		
		desenho = new Desenho();
		//JLabel carrosNaSimulacao = new JLabel("Carros na simulação: "); 
		jpnl.add(botoes, BorderLayout.WEST);
		jpnl.add(desenho, BorderLayout.CENTER);
		
		frame.add(jpnl);
		frame.pack();
		frame.setVisible(true);
	}
	
	public void atualizaInterface(){
		desenho.repaint();
	}

	public void run() {
		while( true ){
			atualizaInterface();
			try {
				Thread.sleep(30);
			} catch (InterruptedException e) {
			}
		}
	}
}

class Desenho extends Canvas {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 123456789L;
	private final int distanciaPistas = 70;
	private final int tamanhoFaixas = 30;
	private final int distanciaAcostamento = 15;
	
	ArrayList<Carro> carros;

	public Desenho(){
		carros = Controlador.getCarros();
		setForeground(Color.black);
		setBackground(Color.gray);
		setSize(705, 700);
	}
	
	private Color pegaCor(int cor){
		switch (cor) {
		case 1:
			return Color.white;
		case 2:
			return Color.yellow;
		case 3:
			return Color.green;
		case 4:
			return Color.red;
		case 5:
			return Color.blue;
		case 6:
			return Color.magenta;
		case 7:
			return Color.orange;
		case 8:
			return Color.cyan;
		default:
			return Color.pink;
		}
	}
	
	public void update(Graphics g){
		// Fazemos um double buffering para a tela não ficar piscando
		Dimension d = getSize();
		Graphics buffer;
		Image doubleimg = createImage(d.width, d.height);
		
		buffer = doubleimg.getGraphics();
		
		buffer.setColor(getBackground());
		buffer.fillRect(0, 0, d.width, d.height);
		buffer.setColor(getForeground());
		
		// Pinta no buffer
		paint(buffer);
		
		// Flippa
		g.drawImage(doubleimg, 0, 0, this);
	}
	
	private void pintaContorno(Graphics buffer) {
		buffer.setColor(Color.black);
		// Horizontais
		for(int i = 0; i < 11; i++){
			buffer.drawLine(0, i*(distanciaPistas), 710, i*(distanciaPistas));
			// Linhas tracejadas
			for(int j = 0; j <= 700; j += 50)
				buffer.drawLine(j, (i*distanciaPistas) + distanciaPistas/2, j + tamanhoFaixas, (i*distanciaPistas) + distanciaPistas/2);
			// Faixa de pedestre
			buffer.setColor(Color.white);
			for(int j = distanciaPistas*i + 5; j < i*distanciaPistas + distanciaPistas; j += 5)
				buffer.drawLine((int)((Controlador.getTamanhoTrecho()*70)/2) - 5, j, (int)((Controlador.getTamanhoTrecho()*70)/2) + 5, j);
			buffer.setColor(Color.black);
		}
		// Verticais
		buffer.drawLine(0, 0, 0, 500);
		buffer.drawLine(710, 0, 710, 500);
	}
	
	public void pintaCarro(Graphics buffer, Carro carro){
		buffer.setColor(pegaCor(carro.getCor()));
		int y = 5 + (int)(carro.getTrechoAtual()*distanciaPistas);
		int x = (int)(carro.getPosicao()*70.0);
		if(carro.isNoAcostamento()){
			y += distanciaAcostamento;
		}
		if(carro.getDirecao() == 1){
			y = y + (distanciaPistas/2);
		}
		buffer.fillOval(x, y, 10, 10);
		if(carro.isVeloz()){
			buffer.setColor(Color.black);
			buffer.fillOval(x + 2, y + 2, 6, 6);
		}
	}
	
	public void pintaPedestres(Graphics buffer){
		buffer.setColor(Color.black);
		for(int i = 0; i < Controlador.getNumeroTrechos(); i++){
			if(Controlador.temPedestreTrecho(i)){
				// Os numeros são mágicos, e foram estipulados por tentativa e erro.
				buffer.drawString("P", (int)(Controlador.getTamanhoTrecho()*70)/2 - 3 , i*distanciaPistas + 24);
				buffer.drawString("P", (int)(Controlador.getTamanhoTrecho()*70)/2 - 3 , i*distanciaPistas + 54);
			}
		}
			
	}
	
	public void paint(Graphics g){
		// Desenha os contornos
		Graphics buffer = g;
		pintaContorno(buffer);
		
		// Desenha os carros
		for(Carro carro : carros) if (!carro.chegouNoDestino() && carro.getPosicao() > 1e-5 && carro.getPosicao() < 10 - 1e-5){
			pintaCarro(buffer, carro);
		}
		// Desenha pedestres
		pintaPedestres(buffer);
		g = buffer;
	}

}
